import fitz
import logging
from pathlib import Path
from tkinter import filedialog


class PdfToPngConverter:
    """用于将PDF文件转换为PNG图片"""
    def __init__(self, input_folder):
        """
        初始化转换器
        :param input_folder: PDF文件所在的输入文件夹路径
        """
        self.logger = None
        self.output_folder = None
        self.input_folder = input_folder
        self.setup_logging()

    def setup_logging(self):
        """设置日志配置"""
        logging.basicConfig(
            level=logging.INFO,
            format='%(asctime)s - %(levelname)s - %(message)s'
        )
        self.logger = logging.getLogger(__name__)

    def convert_pdf_to_png(self, pdf_path):
        """
        将单个PD文件转换成为PNG图片
        :param pdf_path: PDF文件路径
        :return: 生成PNG文件路径列表
        """
        # 获取PDF文件名(不含扩展名)
        pdf_name = Path(pdf_path).stem

        # 创建输出目录
        output_dir = Path(pdf_path).parent / pdf_name
        output_dir.mkdir(exist_ok=True)

        try:
            # 打开PDF文件
            pdf_doc = fitz.open(pdf_path)

            # 转换每一页
            for page_number in range(pdf_doc.page_count):
                # 获取页面
                page = pdf_doc[page_number]

                # 设置高分辨率
                zoom = 2.0  # 增加缩放比例以提高质量
                mat = fitz.Matrix(zoom, zoom)

                # 获取页面的像素图
                pix = page.get_pixmap(matrix=mat, alpha=False)

                # 保存为PNG
                output_path = output_dir / f"page_{page_number + 1}.png"
                pix.save(str(output_path))

                print(f'已保存：{output_path}')

            # 关闭PDF文件
        except Exception as e:
            self.logger.error(e)
            raise

    def process_folder(self):
        """处理输入文件夹中的所有PDF文件"""
        if self.input_folder is None:
            print("未选择文件夹，程序退出")
            return

        # 将选择的路径转换为Path对象
        current_dir = Path(self.input_folder)

        # 查找所有PDF文件
        pdf_files = list(current_dir.glob("*.pdf"))

        if not pdf_files:
            print("当前文件夹中没有找到PDF文件")
            return

        print(f"找到{len(pdf_files)}个PDF文件")

        # 转换每个PDF文件
        for pdf_file in pdf_files:
            print(f'\n正在处理{pdf_file}')
            self.convert_pdf_to_png(pdf_file)


if __name__ == '__main__':
    pdf_folder_path = filedialog.askdirectory(title="请选择PDF文件夹")

    # 实例化工具
    pdf_to_png_converter = PdfToPngConverter(pdf_folder_path)

    # 调用批量处理工具
    pdf_to_png_converter.process_folder()
